var,let,const의 주요 차이점은 무엇인가
var
,let
,const
는 전부 변수 선언 키워드이지만 중요한 차이점이 있다.
주요 차이 (스코프,재선언,재할당)#
let
과 const
는 var
의 단점(함수 스코프, 재선언 가능 등)을 보완하기 위해 ES6에서 도입되었다. 블록 스코프와 재선언/재할당 규칙은 코드를 더 예측 가능하고 안전하게 만들어주기 때문에, 현대 자바스크립트 개발에서는 var
대신 let
과 const
사용이 강력히 권장된다. const
를 기본으로 사용하고, 재할당이 필요한 경우에만 let
을 사용하는것이 좋다.
스코프(Scope)#
-
var
**함수 스코프(Function Scope)**를 갖는다. 함수 내에서 선언된var
변수는 함수 전체에서 유효하며, 함수 외부에서는 접근할 수 없다. 블록({}
)스코프를 가지지 않아if
문이나for
문 블록 내에서 선언해도 해당 블록 외부에서 접근이 가능하다. -
let
,const
**블록 스코프(Block Scope)**를 가진다. 변수가 선언된 블록({}
),문(statement), 또는 표현식 내에서만 유효하다. 이는 변수의 유효 범위를 더 좁게 제한하여 의도치 않은 값 변경이나 충돌을 방지한다.
- 스코프(Scope)란 무엇인가
재선언(Redeclaration)#
-
var
같은 스코프 내에서 동일한 이름으로 변수를 다시 생성해도 에러가 발생하지 않는다. 이는 실수로 변수를 덮어쓰는 문제를 일으킬 수 있다. -
let
,const
같은 스코프 내에서 동일한 이름으로 변수를 다시 선언하면SyntaxError
가 발생한다.
재할당(Reassignment)#
var
,let
선언 후에 다른 값으로 재할당 하는 것이 가능하다.const
선언시 반드시 값으로 초기화해야 하며, 한번 할당된 후에는 다른 값으로 재할당할 수 없다(상수). 단,const
로 선언된 객체나 배열의 경우, 객체 자체를 재할당할 수는 없지만 그 내부의 속성이나 요소는 변경할 수 있다(객체/배열 자체가 불변이 되는것은 아님).
비교표#
기능(Feature) | var | let | const |
---|---|---|---|
스코프(Scope) | 함수 스코프(Function) | 블록 스코프(Block) | 블록 스코프(Block) |
호이스팅(Hoisting) | 선언 + undefined 초기화 | 선언만(초기화X) | 선언만(초기화X) |
재선언 (Redeclaration) | 가능(O) | 불가능(X,같은 스코프 내) | 불가능(X,같은 스코프 내) |
재할당(Reassignment) | 가능(O) | 가능(O) | 불가능(X) |
시간적 사각지대(TDZ) | 없음(X) | 있음(O) | 있음(O) |
선언 전 접근 (Access before) | undefined | ReferenceError | ReferenceError |
let
과const
가 TDZ를 가지는 것은 선언 전에 변수를 사용하는 실수를 방지하는 데 도움을 준다.
var
에서 let
과 const
로의 전환은 단순히 새로운 키워드를 사용하는 것을 넘어, 자바스크립트 언어가 더 안전하고 예측 가능한 코드를 작성하도록 발전해 왔음을 보여준다. var
은 함수 레벨 스코프와 undefined
로 초키화되는 호이스팅 특성 때문에, 특히 반복문이나 조건문 내에서 변수를 사용할 땡 셰아치 못한 버그를 유라하는 경우가 많았다. 예를 들어, for
루프에서 이러한 문제를 해결하기 위해 블록 스코프와 TDZ를 도입하여, 변수의 유효 범위를 명확히 하고 선언 전에 접근하는 것을 막아 코드의 안정성을 높였다.
- 호이스팅(Hoisting)이란 무엇인가